home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / hity wydania / Ubuntu 9.10 PL / karmelkowy-koliberek-desktop-9.10-i386-PL.iso / casper / filesystem.squashfs / usr / lib / python2.6 / bdb.pyc (.txt) < prev    next >
Python Compiled Bytecode  |  2009-11-11  |  18KB  |  639 lines

  1. # Source Generated with Decompyle++
  2. # File: in.pyc (Python 2.6)
  3.  
  4. '''Debugger basics'''
  5. import sys
  6. import os
  7. import types
  8. __all__ = [
  9.     'BdbQuit',
  10.     'Bdb',
  11.     'Breakpoint']
  12.  
  13. class BdbQuit(Exception):
  14.     '''Exception to give up completely'''
  15.     pass
  16.  
  17.  
  18. class Bdb:
  19.     '''Generic Python debugger base class.
  20.  
  21.     This class takes care of details of the trace facility;
  22.     a derived class should implement user interaction.
  23.     The standard debugger class (pdb.Pdb) is an example.
  24.     '''
  25.     
  26.     def __init__(self):
  27.         self.breaks = { }
  28.         self.fncache = { }
  29.  
  30.     
  31.     def canonic(self, filename):
  32.         if filename == '<' + filename[1:-1] + '>':
  33.             return filename
  34.         canonic = self.fncache.get(filename)
  35.         if not canonic:
  36.             canonic = os.path.abspath(filename)
  37.             canonic = os.path.normcase(canonic)
  38.             self.fncache[filename] = canonic
  39.         
  40.         return canonic
  41.  
  42.     
  43.     def reset(self):
  44.         import linecache as linecache
  45.         linecache.checkcache()
  46.         self.botframe = None
  47.         self._set_stopinfo(None, None)
  48.  
  49.     
  50.     def trace_dispatch(self, frame, event, arg):
  51.         if self.quitting:
  52.             return None
  53.         if event == 'line':
  54.             return self.dispatch_line(frame)
  55.         if event == 'call':
  56.             return self.dispatch_call(frame, arg)
  57.         if event == 'return':
  58.             return self.dispatch_return(frame, arg)
  59.         if event == 'exception':
  60.             return self.dispatch_exception(frame, arg)
  61.         if event == 'c_call':
  62.             return self.trace_dispatch
  63.         if event == 'c_exception':
  64.             return self.trace_dispatch
  65.         if event == 'c_return':
  66.             return self.trace_dispatch
  67.         print 'bdb.Bdb.dispatch: unknown debugging event:', repr(event)
  68.         return self.trace_dispatch
  69.  
  70.     
  71.     def dispatch_line(self, frame):
  72.         if self.stop_here(frame) or self.break_here(frame):
  73.             self.user_line(frame)
  74.             if self.quitting:
  75.                 raise BdbQuit
  76.             self.quitting
  77.         
  78.         return self.trace_dispatch
  79.  
  80.     
  81.     def dispatch_call(self, frame, arg):
  82.         if self.botframe is None:
  83.             self.botframe = frame.f_back
  84.             return self.trace_dispatch
  85.         if not self.stop_here(frame) or self.break_anywhere(frame):
  86.             return None
  87.         self.user_call(frame, arg)
  88.         if self.quitting:
  89.             raise BdbQuit
  90.         self.quitting
  91.         return self.trace_dispatch
  92.  
  93.     
  94.     def dispatch_return(self, frame, arg):
  95.         if self.stop_here(frame) or frame == self.returnframe:
  96.             self.user_return(frame, arg)
  97.             if self.quitting:
  98.                 raise BdbQuit
  99.             self.quitting
  100.         
  101.         return self.trace_dispatch
  102.  
  103.     
  104.     def dispatch_exception(self, frame, arg):
  105.         if self.stop_here(frame):
  106.             self.user_exception(frame, arg)
  107.             if self.quitting:
  108.                 raise BdbQuit
  109.             self.quitting
  110.         
  111.         return self.trace_dispatch
  112.  
  113.     
  114.     def stop_here(self, frame):
  115.         if frame is self.stopframe:
  116.             return frame.f_lineno >= self.stoplineno
  117.         while frame is not None and frame is not self.stopframe:
  118.             if frame is self.botframe:
  119.                 return True
  120.             frame = frame.f_back
  121.             continue
  122.             frame is self.botframe
  123.         return False
  124.  
  125.     
  126.     def break_here(self, frame):
  127.         filename = self.canonic(frame.f_code.co_filename)
  128.         if filename not in self.breaks:
  129.             return False
  130.         lineno = frame.f_lineno
  131.         (bp, flag) = effective(filename, lineno, frame)
  132.         if bp:
  133.             self.currentbp = bp.number
  134.             if flag and bp.temporary:
  135.                 self.do_clear(str(bp.number))
  136.             
  137.             return True
  138.         return False
  139.  
  140.     
  141.     def do_clear(self, arg):
  142.         raise NotImplementedError, 'subclass of bdb must implement do_clear()'
  143.  
  144.     
  145.     def break_anywhere(self, frame):
  146.         return self.canonic(frame.f_code.co_filename) in self.breaks
  147.  
  148.     
  149.     def user_call(self, frame, argument_list):
  150.         '''This method is called when there is the remote possibility
  151.         that we ever need to stop in this function.'''
  152.         pass
  153.  
  154.     
  155.     def user_line(self, frame):
  156.         '''This method is called when we stop or break at this line.'''
  157.         pass
  158.  
  159.     
  160.     def user_return(self, frame, return_value):
  161.         '''This method is called when a return trap is set here.'''
  162.         pass
  163.  
  164.     
  165.     def user_exception(self, frame, exc_info):
  166.         (exc_type, exc_value, exc_traceback) = exc_info
  167.  
  168.     
  169.     def _set_stopinfo(self, stopframe, returnframe, stoplineno = -1):
  170.         self.stopframe = stopframe
  171.         self.returnframe = returnframe
  172.         self.quitting = 0
  173.         self.stoplineno = stoplineno
  174.  
  175.     
  176.     def set_until(self, frame):
  177.         '''Stop when the line with the line no greater than the current one is
  178.         reached or when returning from current frame'''
  179.         self._set_stopinfo(frame, frame, frame.f_lineno + 1)
  180.  
  181.     
  182.     def set_step(self):
  183.         '''Stop after one line of code.'''
  184.         self._set_stopinfo(None, None)
  185.  
  186.     
  187.     def set_next(self, frame):
  188.         '''Stop on the next line in or below the given frame.'''
  189.         self._set_stopinfo(frame, None)
  190.  
  191.     
  192.     def set_return(self, frame):
  193.         '''Stop when returning from the given frame.'''
  194.         self._set_stopinfo(frame.f_back, frame)
  195.  
  196.     
  197.     def set_trace(self, frame = None):
  198.         """Start debugging from `frame`.
  199.  
  200.         If frame is not specified, debugging starts from caller's frame.
  201.         """
  202.         if frame is None:
  203.             frame = sys._getframe().f_back
  204.         
  205.         self.reset()
  206.         while frame:
  207.             frame.f_trace = self.trace_dispatch
  208.             self.botframe = frame
  209.             frame = frame.f_back
  210.         self.set_step()
  211.         sys.settrace(self.trace_dispatch)
  212.  
  213.     
  214.     def set_continue(self):
  215.         self._set_stopinfo(self.botframe, None)
  216.         if not self.breaks:
  217.             sys.settrace(None)
  218.             frame = sys._getframe().f_back
  219.             while frame and frame is not self.botframe:
  220.                 del frame.f_trace
  221.                 frame = frame.f_back
  222.         
  223.  
  224.     
  225.     def set_quit(self):
  226.         self.stopframe = self.botframe
  227.         self.returnframe = None
  228.         self.quitting = 1
  229.         sys.settrace(None)
  230.  
  231.     
  232.     def set_break(self, filename, lineno, temporary = 0, cond = None, funcname = None):
  233.         filename = self.canonic(filename)
  234.         import linecache
  235.         line = linecache.getline(filename, lineno)
  236.         if not line:
  237.             return 'Line %s:%d does not exist' % (filename, lineno)
  238.         if filename not in self.breaks:
  239.             self.breaks[filename] = []
  240.         
  241.         list = self.breaks[filename]
  242.         if lineno not in list:
  243.             list.append(lineno)
  244.         
  245.         bp = Breakpoint(filename, lineno, temporary, cond, funcname)
  246.  
  247.     
  248.     def clear_break(self, filename, lineno):
  249.         filename = self.canonic(filename)
  250.         if filename not in self.breaks:
  251.             return 'There are no breakpoints in %s' % filename
  252.         if lineno not in self.breaks[filename]:
  253.             return 'There is no breakpoint at %s:%d' % (filename, lineno)
  254.         for bp in Breakpoint.bplist[(filename, lineno)][:]:
  255.             bp.deleteMe()
  256.         
  257.         if not self.breaks[filename]:
  258.             del self.breaks[filename]
  259.         
  260.  
  261.     
  262.     def clear_bpbynumber(self, arg):
  263.         
  264.         try:
  265.             number = int(arg)
  266.         except:
  267.             return 'Non-numeric breakpoint number (%s)' % arg
  268.  
  269.         
  270.         try:
  271.             bp = Breakpoint.bpbynumber[number]
  272.         except IndexError:
  273.             return 'Breakpoint number (%d) out of range' % number
  274.  
  275.         if not bp:
  276.             return 'Breakpoint (%d) already deleted' % number
  277.         self.clear_break(bp.file, bp.line)
  278.  
  279.     
  280.     def clear_all_file_breaks(self, filename):
  281.         filename = self.canonic(filename)
  282.         if filename not in self.breaks:
  283.             return 'There are no breakpoints in %s' % filename
  284.         for line in self.breaks[filename]:
  285.             blist = Breakpoint.bplist[(filename, line)]
  286.             for bp in blist:
  287.                 bp.deleteMe()
  288.             
  289.         
  290.         del self.breaks[filename]
  291.  
  292.     
  293.     def clear_all_breaks(self):
  294.         if not self.breaks:
  295.             return 'There are no breakpoints'
  296.         for bp in Breakpoint.bpbynumber:
  297.             if bp:
  298.                 bp.deleteMe()
  299.                 continue
  300.             self.breaks
  301.         
  302.         self.breaks = { }
  303.  
  304.     
  305.     def get_break(self, filename, lineno):
  306.         filename = self.canonic(filename)
  307.         if filename in self.breaks:
  308.             pass
  309.         return lineno in self.breaks[filename]
  310.  
  311.     
  312.     def get_breaks(self, filename, lineno):
  313.         filename = self.canonic(filename)
  314.         if not filename in self.breaks and lineno in self.breaks[filename] or Breakpoint.bplist[(filename, lineno)]:
  315.             pass
  316.         return []
  317.  
  318.     
  319.     def get_file_breaks(self, filename):
  320.         filename = self.canonic(filename)
  321.         if filename in self.breaks:
  322.             return self.breaks[filename]
  323.         return []
  324.  
  325.     
  326.     def get_all_breaks(self):
  327.         return self.breaks
  328.  
  329.     
  330.     def get_stack(self, f, t):
  331.         stack = []
  332.         if t and t.tb_frame is f:
  333.             t = t.tb_next
  334.         
  335.         while f is not None:
  336.             stack.append((f, f.f_lineno))
  337.             if f is self.botframe:
  338.                 break
  339.             
  340.             f = f.f_back
  341.         stack.reverse()
  342.         i = max(0, len(stack) - 1)
  343.         while t is not None:
  344.             stack.append((t.tb_frame, t.tb_lineno))
  345.             t = t.tb_next
  346.         if f is None:
  347.             i = max(0, len(stack) - 1)
  348.         
  349.         return (stack, i)
  350.  
  351.     
  352.     def format_stack_entry(self, frame_lineno, lprefix = ': '):
  353.         import linecache
  354.         import repr
  355.         (frame, lineno) = frame_lineno
  356.         filename = self.canonic(frame.f_code.co_filename)
  357.         s = '%s(%r)' % (filename, lineno)
  358.         if frame.f_code.co_name:
  359.             s = s + frame.f_code.co_name
  360.         else:
  361.             s = s + '<lambda>'
  362.         if '__args__' in frame.f_locals:
  363.             args = frame.f_locals['__args__']
  364.         else:
  365.             args = None
  366.         if args:
  367.             s = s + repr.repr(args)
  368.         else:
  369.             s = s + '()'
  370.         if '__return__' in frame.f_locals:
  371.             rv = frame.f_locals['__return__']
  372.             s = s + '->'
  373.             s = s + repr.repr(rv)
  374.         
  375.         line = linecache.getline(filename, lineno, frame.f_globals)
  376.         if line:
  377.             s = s + lprefix + line.strip()
  378.         
  379.         return s
  380.  
  381.     
  382.     def run(self, cmd, globals = None, locals = None):
  383.         if globals is None:
  384.             import __main__ as __main__
  385.             globals = __main__.__dict__
  386.         
  387.         if locals is None:
  388.             locals = globals
  389.         
  390.         self.reset()
  391.         sys.settrace(self.trace_dispatch)
  392.         if not isinstance(cmd, types.CodeType):
  393.             cmd = cmd + '\n'
  394.         
  395.         
  396.         try:
  397.             exec cmd in globals, locals
  398.         except BdbQuit:
  399.             pass
  400.         finally:
  401.             self.quitting = 1
  402.             sys.settrace(None)
  403.  
  404.  
  405.     
  406.     def runeval(self, expr, globals = None, locals = None):
  407.         if globals is None:
  408.             import __main__
  409.             globals = __main__.__dict__
  410.         
  411.         if locals is None:
  412.             locals = globals
  413.         
  414.         self.reset()
  415.         sys.settrace(self.trace_dispatch)
  416.         if not isinstance(expr, types.CodeType):
  417.             expr = expr + '\n'
  418.         
  419.         
  420.         try:
  421.             return eval(expr, globals, locals)
  422.         except BdbQuit:
  423.             pass
  424.         finally:
  425.             self.quitting = 1
  426.             sys.settrace(None)
  427.  
  428.  
  429.     
  430.     def runctx(self, cmd, globals, locals):
  431.         self.run(cmd, globals, locals)
  432.  
  433.     
  434.     def runcall(self, func, *args, **kwds):
  435.         self.reset()
  436.         sys.settrace(self.trace_dispatch)
  437.         res = None
  438.         
  439.         try:
  440.             res = func(*args, **kwds)
  441.         except BdbQuit:
  442.             pass
  443.         finally:
  444.             self.quitting = 1
  445.             sys.settrace(None)
  446.  
  447.         return res
  448.  
  449.  
  450.  
  451. def set_trace():
  452.     Bdb().set_trace()
  453.  
  454.  
  455. class Breakpoint:
  456.     '''Breakpoint class
  457.  
  458.     Implements temporary breakpoints, ignore counts, disabling and
  459.     (re)-enabling, and conditionals.
  460.  
  461.     Breakpoints are indexed by number through bpbynumber and by
  462.     the file,line tuple using bplist.  The former points to a
  463.     single instance of class Breakpoint.  The latter points to a
  464.     list of such instances since there may be more than one
  465.     breakpoint per line.
  466.  
  467.     '''
  468.     next = 1
  469.     bplist = { }
  470.     bpbynumber = [
  471.         None]
  472.     
  473.     def __init__(self, file, line, temporary = 0, cond = None, funcname = None):
  474.         self.funcname = funcname
  475.         self.func_first_executable_line = None
  476.         self.file = file
  477.         self.line = line
  478.         self.temporary = temporary
  479.         self.cond = cond
  480.         self.enabled = 1
  481.         self.ignore = 0
  482.         self.hits = 0
  483.         self.number = Breakpoint.next
  484.         Breakpoint.next = Breakpoint.next + 1
  485.         self.bpbynumber.append(self)
  486.         if self.bplist.has_key((file, line)):
  487.             self.bplist[(file, line)].append(self)
  488.         else:
  489.             self.bplist[(file, line)] = [
  490.                 self]
  491.  
  492.     
  493.     def deleteMe(self):
  494.         index = (self.file, self.line)
  495.         self.bpbynumber[self.number] = None
  496.         self.bplist[index].remove(self)
  497.         if not self.bplist[index]:
  498.             del self.bplist[index]
  499.         
  500.  
  501.     
  502.     def enable(self):
  503.         self.enabled = 1
  504.  
  505.     
  506.     def disable(self):
  507.         self.enabled = 0
  508.  
  509.     
  510.     def bpprint(self, out = None):
  511.         if out is None:
  512.             out = sys.stdout
  513.         
  514.         if self.temporary:
  515.             disp = 'del  '
  516.         else:
  517.             disp = 'keep '
  518.         if self.enabled:
  519.             disp = disp + 'yes  '
  520.         else:
  521.             disp = disp + 'no   '
  522.         print >>out, '%-4dbreakpoint   %s at %s:%d' % (self.number, disp, self.file, self.line)
  523.         if self.cond:
  524.             print >>out, '\tstop only if %s' % (self.cond,)
  525.         
  526.         if self.ignore:
  527.             print >>out, '\tignore next %d hits' % self.ignore
  528.         
  529.         if self.hits:
  530.             if self.hits > 1:
  531.                 ss = 's'
  532.             else:
  533.                 ss = ''
  534.             print >>out, '\tbreakpoint already hit %d time%s' % (self.hits, ss)
  535.         
  536.  
  537.  
  538.  
  539. def checkfuncname(b, frame):
  540.     '''Check whether we should break here because of `b.funcname`.'''
  541.     if not b.funcname:
  542.         if b.line != frame.f_lineno:
  543.             return False
  544.         return True
  545.     if frame.f_code.co_name != b.funcname:
  546.         return False
  547.     if b.func_first_executable_line != frame.f_lineno:
  548.         return False
  549.     return True
  550.  
  551.  
  552. def effective(file, line, frame):
  553.     '''Determine which breakpoint for this file:line is to be acted upon.
  554.  
  555.     Called only if we know there is a bpt at this
  556.     location.  Returns breakpoint that was triggered and a flag
  557.     that indicates if it is ok to delete a temporary bp.
  558.  
  559.     '''
  560.     possibles = Breakpoint.bplist[(file, line)]
  561.     for i in range(0, len(possibles)):
  562.         b = possibles[i]
  563.         if b.enabled == 0:
  564.             continue
  565.         
  566.         if not checkfuncname(b, frame):
  567.             continue
  568.         
  569.         b.hits = b.hits + 1
  570.         if not b.cond:
  571.             if b.ignore > 0:
  572.                 b.ignore = b.ignore - 1
  573.                 continue
  574.             else:
  575.                 return (b, 1)
  576.         b.ignore > 0
  577.         
  578.         try:
  579.             val = eval(b.cond, frame.f_globals, frame.f_locals)
  580.             if val:
  581.                 if b.ignore > 0:
  582.                     b.ignore = b.ignore - 1
  583.                 else:
  584.                     return (b, 1)
  585.             b.ignore > 0
  586.         continue
  587.         return (b, 0)
  588.  
  589.     
  590.     return (None, None)
  591.  
  592.  
  593. class Tdb(Bdb):
  594.     
  595.     def user_call(self, frame, args):
  596.         name = frame.f_code.co_name
  597.         if not name:
  598.             name = '???'
  599.         
  600.         print '+++ call', name, args
  601.  
  602.     
  603.     def user_line(self, frame):
  604.         import linecache
  605.         name = frame.f_code.co_name
  606.         if not name:
  607.             name = '???'
  608.         
  609.         fn = self.canonic(frame.f_code.co_filename)
  610.         line = linecache.getline(fn, frame.f_lineno, frame.f_globals)
  611.         print '+++', fn, frame.f_lineno, name, ':', line.strip()
  612.  
  613.     
  614.     def user_return(self, frame, retval):
  615.         print '+++ return', retval
  616.  
  617.     
  618.     def user_exception(self, frame, exc_stuff):
  619.         print '+++ exception', exc_stuff
  620.         self.set_continue()
  621.  
  622.  
  623.  
  624. def foo(n):
  625.     print 'foo(', n, ')'
  626.     x = bar(n * 10)
  627.     print 'bar returned', x
  628.  
  629.  
  630. def bar(a):
  631.     print 'bar(', a, ')'
  632.     return a / 2
  633.  
  634.  
  635. def test():
  636.     t = Tdb()
  637.     t.run('import bdb; bdb.foo(10)')
  638.  
  639.